package yz.mr.count;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
 * 需求：
 *      读取学生的数据，并对学生的成绩求和
 *
 * 分析：
 *      1.Mapper阶段
 *          按行读取文本数据，并且对当前行的数据进行数据分析
 *          ①读取每一行的数据   1500100001,1000001,98
 *          ②对每一行的数据进行切分
 *          ③需要组合key value将数据写出  以学生编号进行key  学生的成绩进行value
 *              因为需要将学生进行分组，将相同学生的成绩汇总在一起，在对成绩进行累加
 *
 *      2.Reduce阶段
 *          ①接收Mapper端输出的数据，将相同的学生ID的数据进行一次Reduce函数操作
 *          ②对所有的学生的成绩数据进行求和
 *          ③将累计的数据写出到本地或者到HDFS中
 */
public class ScoreCount {
    public static void main(String[] args) throws Exception{

        //1.创建Job操作对象
        //2.创建配置类对象
        Configuration entries = new Configuration();
        Job job = Job.getInstance(entries);

        //3.配置job
        job.setJobName("ScoreCount");
        job.setJarByClass(ScoreCount.class);

        //4.设置Mapper以及输出类型
        job.setMapperClass(ScoreCountMapper.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //5.设置Reduce以及输出对象
        job.setReducerClass(ScoreCountReducer.class);

        //6.设置最终地输出数据类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //7.设置输入输出路径(这是本地的路径)  输入路径既可以指定路径也可以指定目录
        FileInputFormat.addInputPath(job,new Path("src/main/dataFile/score.txt"));
        FileOutputFormat.setOutputPath(job,new Path("output/scoreCount"));

        //8.提交执行当前JOB
        job.waitForCompletion(true);

    }
}
